/*
malloc ：动态分配内存，不会初始化赋值
	int *arr=（int *）malloc(sizeof(int )*4);//向堆区申请16个字节
realloc :内存不足时再次补充申请空间，但写入的空间为总空间
	arr=realloc(arr,sizeof(int)*10);//向堆区一共申请40个字节，若之前已经申请16个字节，则本次补充申请了24个字节，而非补充了40个字节
calloc:动态分配内存，会初始化赋值为0
    int *arr=(int *)calloc(sizeof(int)*5,sizeof(int));//申请20个字符空间
free：释放
memcpy (目的数据地址，源数据地址，n字节数)；//从元数据地址的空间复制n个字节的数据到目的数据的空间
memset(指针，字符常量，n);//将指针指向的空间的前n个字节清空为指定字符常量
 */
#include <stdio.h>
#include <string.h>//内存操作函数头文件 ----字符串操作函数
#include <stdlib.h>//动态分配  malloc  calloc等函数的头文件
int g_a=111;
void fun(void)
{
    int g_a=222;
    g_a++;
    printf("fun函数:g_a=%d\n",g_a);
}
int c;
void malloc_realloc_calloc(void)
{
    // printf("fun函数:g_a=%d\n",g_a);
    // fun();
    // printf("fun函数:g_a=%d\n",g_a);

    //变量  malloc
    int *p=(int *)malloc(sizeof(int));//向堆区申请4个字节的空间
    int a=10,b,num[10];
    *p=100;
    printf("p:%p,*p=%d\n",p,*p);
    printf("&a:%p,a=%d\n",&a,a);
    printf("&b:%p,num=%p\n",&b,num);
    printf("&c:%p\n",&c);
    //记得释放 free
    free(p);

    //数组
    int *arr=(int *)malloc(sizeof(int)*10);//向堆区申请40个字节的空间
    //理解为arr就是数组的首地址  该数组有10个元素
    int i;
    // for(i=0;i<10;i++)
    // {
    //     arr[i]=i;
    // }
    // arr=(int *)realloc(arr,15*sizeof(int));//空间不够，继续申请5*4=20个字符空间
    // for(i=0;i<15;i++)
    // {
    //     arr[i]=i;
    // }
    for(i=0;i<10;i++)
    {
        printf("%d\t",arr[i]);
    }
    printf("\n");
    free(arr);

    //calloc
    int *arr2=(int *)calloc(40,4);
    for(i=0;i<10;i++)
    {
        printf("arr2[%d]:%d\n",i,arr2[i]);
    }
    free(arr2);
}

int main(void)
{
    char *s1=(char *)malloc(sizeof(char)*20);//20个字节
    printf("请输入一串数据");
    scanf("%s",s1);//对申请的那段内存进行字符串的输入赋值操作
    printf("s1:%s\n",s1);
    //memset 将某一段空间清空成指定的内容
    memset(s1,'a',20);
    printf("s1:%s\n",s1);
    memset(s1,'\0',1);
    printf("s1:%s\n",s1);
    free(s1);//释放

    int *arr=(int *)calloc(sizeof(int)*5,sizeof(int));//申请20个字符空间
    int *b=(int *)calloc(sizeof(int)*10,sizeof(int));
    int i;
    for(i=0;i<5;i++)
    {
        arr[i]=i+1;//1-5
    }
    //memcpy
    memcpy(b,arr,20);//从a中拷贝前20个字节数据给b
    for(i=0;i<10;i++)
    {
        printf("b[%d]:%d\t",i,b[i]);
    }
    printf("\n");
    free(arr);
    free(b);
    return 0;
}